1. Field of the Invention
This invention relates to the field of digital audio decoding, and in particular to an audio decoder which implements an efficient method for preventing decoder deadlock due to shared access of hardware components.
2. Description of the Related Art
Digital audio and video programs in initial sampled form and final playback form comprise an enormous amount of data, indeed so much that it would be prohibitively expensive to store or to secure the necessary bandwidth and power to transmit programs of moderate quality and length. To address this problem, compression techniques are commonly employed to reduce the amount of data by which the program is represented during storage and transmission, after which the program is reconstructed by some matched decompression method. To ensure compliance between transmitters and receivers of various manufacturers, several compression standards have been established. For audio compression, MUSICAM and Dolby AC-3 are popular. For multimedia (audio/video) compression, MPEG and DVD are popular.
These standards are not completely distinct and independent, e.g. DVD employs MPEG video compression techniques and allows for use of MUSICAM and AC-3 audio compression techniques. Although attention herein is directed primarily to the DVD standard, much of what is said is also applicable to systems operating according to other compression standards, and exclusion of such systems is not intended.
A compressed bitstream created in accordance with the DVD standard consists of interleaved substreams. Examples of substreams which may be included in a DVD bitstream include audio substreams, a video substream, sub-picture unit (SPU) substreams, and navigation substreams. Each substream consists of data packets having a packet header and a packet payload. The packet header includes identifying information specifying which substream the packet belongs to and where it belongs in that substream. The packet header also includes information specifying the payload type and size, and any compression parameters which may be required for decompression.
To reconstruct the original data from the DVD bitstream, a DVD decoder locates the beginning of a packet, then reads the packet header to determine the substream membership. The decoder then routes the packet payload and portions of the packet header to the appropriate elementary bitstream buffer. Various modules of the decoder then operate on the contents of each buffer to reconstruct the associated program component (i.e. audio, video, SPU, navigation), and the reconstructed program component is finally presented to an appropriate output channel for delivery to the user.
As used herein, "substream" refers to the stream of data packets associated with a program component, and elementary bitstream refers to the data which is written to the elementary bitstream buffers, i.e. the contents of the data packet minus the identifying header fields, but including header fields which specify decompression parameters that may be needed by the ensuing decoder modules. Typically, audio data packets will be divided into audio data frames, with each frame having a frame header and a frame payload.
The DVD standard provides for three audio substream formats: linear pulse code modulation (LPCM), NPEG, and Dolby AC3. Hence, a multimedia decoder which is DVD compliant must support decoding of at least three different audio formats. Of the different audio formats, only one will be received at any given time. Therefore, to minimize decoder cost and avoid unnecessary duplication of hardware, it is desirable to devise a component sharing technique in which operations common to more than one format are carried out by a single component. Similar component sharing is also desirable between functional modules that normally do not operate simultaneously due to other considerations. While desirable, this "time-division" component sharing raises the specter of system deadlock if an error goes undetected during use of a shared component. Since the shared component may not be released as normal due to the error, other functional modules could be halted indefinitely, causing the effect of the error to cascade into system deadlock.
One solution to the deadlock issue is to allocate the shared component for a fixed amount of time, e.g. by setting a timer, and re-allocating the shared component after expiry of the timer. Difficulties with this approach include: a timer needs to be implemented, adding to system complexity; and premature expiry of the timer results in interruption of heretofore error-free operation of a functional block. It is desirable to provide an efficient method of deadlock prevention that avoids these difficulties.